home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 3 / BBS in a box - Trilogy III.iso / Files / System7 tools / Frontier / Frontier SDK 2.1 / Toolkits / IAC Tools / iacasynch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-20  |  2.0 KB  |  112 lines  |  [TEXT/KAHL]

  1.  
  2.  
  3. /*© Copyright 1988-1992 UserLand Software, Inc.  All Rights Reserved.*/
  4.  
  5.  
  6. #include "iacinternal.h"
  7.  
  8.  
  9.  
  10. #define ctreplyhandlers 10
  11.  
  12. typedef struct tyreplyhandler {
  13.     
  14.     long id;
  15.     
  16.     tyAsynchCallback callback;
  17.     } tyreplyhandler;
  18.     
  19. tyreplyhandler replyhandlers [ctreplyhandlers];
  20.  
  21.  
  22.  
  23.  
  24. static Boolean IACaddreplyhandler (tyAsynchCallback callback, long id) {
  25.     
  26.     short i;
  27.     
  28.     for (i = 0; i < ctreplyhandlers; i++) { /*find an empty slot*/
  29.         
  30.         if (replyhandlers [i].id == 0) {
  31.             
  32.             replyhandlers [i].id = id;
  33.             
  34.             replyhandlers [i].callback = callback;
  35.             
  36.             return (true);
  37.             }
  38.         } /*for*/
  39.     
  40.     return (false); /*all slots are in use*/
  41.     } /*IACaddreplyhandler*/
  42.  
  43.  
  44. static pascal OSErr IAChandleanswer (AppleEvent *event, AppleEvent *reply, long refcon) {
  45.     
  46.     long replyid;
  47.     short i;
  48.     
  49.     if (!IACgetlongattr (event, keyReturnIDAttr, typeLongInteger, &replyid))
  50.         return (errAEEventNotHandled);
  51.         
  52.     for (i = 0; i < ctreplyhandlers; i++) {
  53.         
  54.         if (replyhandlers [i].id == replyid) {
  55.             
  56.             replyhandlers [i].id = 0;
  57.             
  58.             (*replyhandlers [i].callback) (event);
  59.             }
  60.         } /*for*/
  61.         
  62.     return (errAEEventNotHandled);
  63.     } /*IAChandleanswer*/
  64.  
  65.  
  66. static Boolean IACasynchinitcheck (void) {
  67.     
  68.     static Boolean fl = false;
  69.     short i;
  70.     
  71.     if (fl) /*it's already been initialized*/
  72.         return (true);
  73.  
  74.     for (i = 0; i < ctreplyhandlers; i++)     
  75.         replyhandlers [i].id = 0;
  76.         
  77.     fl = IACinstallhandler (kCoreEventClass, kAEAnswer, (ProcPtr) &IAChandleanswer);
  78.     
  79.     return (fl);
  80.     } /*IACasynchinitcheck*/
  81.     
  82.  
  83. Boolean IACsendasynch (AppleEvent *event, tyAsynchCallback callback) {
  84.  
  85.     AppleEvent reply;
  86.     OSErr ec;
  87.     long replyid;
  88.     
  89.     if (!IACasynchinitcheck ())
  90.         return (false);
  91.     
  92.     if (!IACgetlongattr (event, keyReturnIDAttr, typeLongInteger, &replyid))
  93.         return (false);
  94.         
  95.     if (!IACaddreplyhandler (callback, replyid))
  96.         return (false);
  97.     
  98.     ec = AESend (
  99.         
  100.         event, &reply, kAEQueueReply + kAECanInteract + kAECanSwitchLayer, 
  101.         
  102.         kAENormalPriority, kNoTimeOut, (ProcPtr) IACwaitroutine, nil);
  103.     
  104.     AEDisposeDesc (event);    
  105.     
  106.     IACglobals.errorcode = ec;
  107.     
  108.     return (ec == noErr);
  109.     } /*IACsendasynch*/
  110.  
  111.  
  112.